import uni from '@dcloudio/vite-plugin-uni'
import Components from '@uni-helper/vite-plugin-uni-components'
import Optimization from '@uni-ku/bundle-optimizer'
import { resolve } from 'path'
import { visualizer } from 'rollup-plugin-visualizer'
import AutoImport from 'unplugin-auto-import/vite'
import { defineConfig, loadEnv, type UserConfig } from 'vite'
import viteCompression from 'vite-plugin-compression'
import ViteRestart from 'vite-plugin-restart'
import VueDevTools from 'vite-plugin-vue-devtools'

/**
 * Vite 配置
 * @see https://vitejs.dev/config/
 */
export default defineConfig(async ({ mode }): Promise<UserConfig> => {
  const UnoCSS = (await import('unocss/vite')).default

  const env = loadEnv(mode, process.cwd())

  const { VITE_APP_PORT, VITE_DROP_DEBUGGER, VITE_DROP_CONSOLE, VITE_SOURCEMAP } = env

  const port = !isNaN(Number(VITE_APP_PORT)) ? Number(VITE_APP_PORT) : 3000

  const convertToBool = (val: string): boolean => {
    return ['true', 'false'].includes(val) ? JSON.parse(val) : false
  }

  const { UNI_PLATFORM, NODE_ENV } = process.env

  const isH5 = UNI_PLATFORM === 'h5'

  const isDev = NODE_ENV === 'development'

  return {
    envPrefix: ['VITE_', 'UNI_'], // 确保加载 .env.*.local 文件
    plugins: [
      /**
       * 分包优化、模块异步跨包调用、组件异步跨包引用
       * @see https://github.com/uni-ku/bundle-optimizer
       */
      Optimization({
        enable: {
          optimization: true,
          'async-import': true,
          'async-component': true,
        },
        dts: {
          base: 'src/types',
        },
        logger: false,
      }),
      /**
       * 自动组件导入插件
       * @see https://uni-helper.js.org/vite-plugin-uni-components
       */
      Components({
        extensions: ['vue'],
        deep: true, // 是否递归扫描子目录，
        directoryAsNamespace: false, // 是否把目录名作为命名空间前缀，true 时组件名为 目录名+组件名，
        dts: 'src/types/components.d.ts', // 自动生成的组件类型声明文件路径（用于 TypeScript 支持）
      }),
      /**
       * 自动导入常用的 API
       * @see https://github.com/antfu/unplugin-auto-import
       */
      AutoImport({
        include: [
          /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx
          /\.vue$/,
          /\.vue\?vue/, // .vue
          /\.md$/,
        ],
        imports: ['vue', 'uni-app'],
        dts: 'src/types/auto-import.d.ts',
        dirs: ['src/hooks', 'src/composables'],
        vueTemplate: true,
      }),
      /**
       * 监听指定文件变化后自动重启 Vite 开发服务器
       * @see https://github.com/antfu/vite-plugin-restart
       */
      ViteRestart({
        // 通过这个插件，在修改vite.config.js文件则不需要重新运行也生效配置
        restart: ['vite.config.ts'],
      }),
      /**
       * Rollup 打包分析工具
       * @see https://github.com/btd/rollup-plugin-visualizer
       */
      isH5 &&
        !isDev &&
        visualizer({
          filename: './node_modules/.cache/visualizer/stats.html', // 生成的分析报告 HTML 文件路径
          open: true, // 打包完成后自动在浏览器打开分析报告
          gzipSize: true, // 显示各模块 gzip 压缩后的体积
          brotliSize: true, // 显示各模块 brotli 压缩后的体积
        }),
      UnoCSS(),
      uni(),
      /**
       * gzip 压缩插件配置（仅在 H5 平台启用）
       * @see https://www.viterc.cn/en/vite-plugin-compression.html
       */
      isH5 &&
        viteCompression({
          verbose: true, // 是否在控制台输出压缩结果
          threshold: 10240, // 体积大于 threshold 才会被压缩，单位 b，默认 10240 (10KB)
        }),
      /**
       * Vue 开发工具插件配置
       * @note 仅在 H5 开发环境启用
       * @see https://github.com/vuejs/devtools
       */
      isH5 && isDev && VueDevTools(),
    ],
    resolve: {
      // 路径别名配置
      alias: {
        '@': resolve(__dirname, 'src'),
        '@styles': resolve(__dirname, 'src/styles'),
      },
    },
    build: {
      // 开发阶段启用源码映射
      sourcemap: convertToBool(VITE_SOURCEMAP),
      // 打包配置
      rollupOptions: {
        output: isH5
          ? {
              // JS 文件打包位置
              chunkFileNames: 'static/js/[name]-[hash].js',
              entryFileNames: 'static/js/[name]-[hash].js',
              // 其他资源保持原有目录结构
              assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
              // 代码分割配置
              manualChunks: {
                'vue-vendor': ['vue'],
                'uni-vendor': ['@dcloudio/uni-app'],
                'ui-vendor': ['wot-design-uni'],
                'lodash-es': ['lodash-es'],
                pinia: ['pinia', 'pinia-plugin-persistedstate'],
              },
            }
          : undefined,
      },
      minify: isDev ? false : ('esbuild' as const),
      terserOptions: {
        compress: {
          // 生产环境移除 console
          drop_console: convertToBool(VITE_DROP_CONSOLE),
          // 生产环境移除 debugger
          drop_debugger: convertToBool(VITE_DROP_DEBUGGER),
        },
      },
    },
    css: {
      // CSS 预处理器配置
      preprocessorOptions: {
        scss: {
          additionalData: '@use "@styles/abstracts" as *;',
        },
      },
    },
    // 开发服务器配置
    server: {
      // 启用热更新
      hmr: true,
      // 服务端口
      port,
      // 是否自动打开浏览器
      open: true,
    },
  }
})
